小编典典

Jquery Ajax 将 JSON 发布到 Web 服务

all

我正在尝试将 JSON 对象发布到 asp.net 网络服务。

我的 json 看起来像这样:

var markers = { "markers": [
  { "position": "128.3657142857143", "markerPosition": "7" },
  { "position": "235.1944023323615", "markerPosition": "19" },
  { "position": "42.5978231292517", "markerPosition": "-3" }
]};

我正在使用 json2.js 对我的 JSON 对象进行字符串化。

我正在使用 jquery 将其发布到我的网络服务。

  $.ajax({
        type: "POST",
        url: "/webservices/PodcastService.asmx/CreateMarkers",
        data: markers,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function(data){alert(data);},
        failure: function(errMsg) {
            alert(errMsg);
        }
  });

我收到以下错误:

无效的 JSON 原语

我发现了一堆与此相关的帖子,这似乎是一个非常常见的问题,但我没有尝试解决这个问题。

当萤火虫发布到服务器时,它看起来像这样:

标记%5B0%5D%5Bposition%5D=128.3657142857143&markers%5B0%5D%5BmarkerPosition%5D=7&markers%5B1%5D%5Bposition%5D=235.1944023323615&markers%5B1%5D%5BmarkerPosition%5D=19&markers%5B2%5D%
5D=42.5978231292517&markers%5B2%5D%5BmarkerPosition%5D=-3

我正在调用的网络服务功能是:

[WebMethod]
public string CreateMarkers(string markerArray)
{
    return "received markers";
}

阅读 168

收藏
2022-05-18

共1个答案

小编典典

您提到使用 json2.js 对数据进行字符串化,但 POSTed 数据似乎是 URLEncoded JSON 您可能已经看过了,但是这篇关于无效
JSON 原语的帖子
涵盖了 JSON 被 URLEncoded 的原因。

建议 不要 将原始的、手动序列化的 JSON 字符串传递到您的方法中。ASP.NET 将自动对请求的 POST 数据进行 JSON
反序列化,因此,如果您手动序列化 JSON 字符串并将其发送到 ASP.NET,您实际上最终将不得不对 JSON 序列化字符串进行 JSON 序列化。

我会建议更多类似的东西:

var markers = [{ "position": "128.3657142857143", "markerPosition": "7" },
               { "position": "235.1944023323615", "markerPosition": "19" },
               { "position": "42.5978231292517", "markerPosition": "-3" }];

$.ajax({
    type: "POST",
    url: "/webservices/PodcastService.asmx/CreateMarkers",
    // The key needs to match your method's input parameter (case-sensitive).
    data: JSON.stringify({ Markers: markers }),
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function(data){alert(data);},
    error: function(errMsg) {
        alert(errMsg);
    }
});

避免无效 JSON 原语问题的关键是向 jQuery 传递data参数的 JSON 字符串,而不是 JavaScript 对象,这样 jQuery
就不会尝试对您的数据进行 URLEncode。

在服务器端,将您的方法的输入参数与您传入的数据的形状相匹配:

public class Marker
{
  public decimal position { get; set; }
  public int markerPosition { get; set; }
}

[WebMethod]
public string CreateMarkers(List<Marker> Markers)
{
  return "Received " + Markers.Count + " markers.";
}

如果您愿意,也可以接受一个数组,例如Marker[] Markers。ASMX ScriptServices 使用的反序列化器
(JavaScriptSerializer) 非常灵活,并且会尽其所能将您的输入数据转换为您指定的服务器端类型。

2022-05-18